

#define I1 (((~CopyPINC & (1<<PORTC5))>>PORTC5) & 0x01)
#define I2 (((~CopyPINC & (1<<PORTC4))>>PORTC4) & 0x01)
#define O1 (1<<PORTD4)
#define O2 (1<<PORTD6)




 //=========== Configuration =============
 
      //Configuration Etape faire
      volatile int  e1 =1;
      volatile int  e2 =0;
	  
	  // -- ajout 6/2/13 -- ou 
	  volatile int NB_etapes = 2;
	  volatile int dim_tab_etape = (NB_etapes /8)+1;
	  volatile byte tab_etape[dim_tab_etape];
	  // -- fin ajout 6/2/13 -- 
	  
	
       //Configuration transition
      volatile int r1 =0;
      volatile int r2 =0;
      // définition des variables
      volatile int CopyPINB;
      volatile int CopyPINC; 
      volatile int CopyPIND;
	  
	  volatile byte CopyPIN[3];
	  volatile byte EtatPrec[3];
	  
      volatile byte SORTB = B00000000; // repérage des Port en sortie voie B
      volatile byte SORTC = B00000000; // repérage des Port en sortie voie D
      volatile byte SORTD = B00000000; // repérage des Port en sortie voie C
	  volatile byte ENTB = B11111111; // repérage des Port en entrée voie B
      volatile byte ENTC = B11111111; // repérage des Port en entrée voie D
      volatile byte ENTD = B11111111; // repérage des Port en entrée voie C
      volatile byte CmdSortB = B00000000; // intention de commande de sortie voie B
      volatile byte CmdSortC = B00000000; // intention de commande de sortie voie C
      volatile byte CmdSortD = B00000000; // intention de commande de sortie voie D
	  
	  //-- ajout 6/2/13 creation de la variable de copie d'etapes 
	  volatile byte Copie_etape[NB_etapes] = etapes[];
	  volatile byte Etat_fin[NB_etapes] = {0,0};
	  
	  // -- fin ajout 6/2/13 
     
 

// ======================================================= SETUP =====================================================

void setup(){
  
       

  
  // ------initialisation des sorties----
      // écriture des variable de sortie:
          //variable de sortie port B
         
         
          SORTB |= (1 << PORTB1);
          //...
          //variable de sortie port C
          //...
          //variable de sortie port D
         
          
          SORTD |= (1 << PORTD4);
          SORTD |= (1 << PORTD5);
          SORTD |= (1 << PORTD6);
          //...    
      // intialisation des port en sortie
          
          
          DDRB |= SORTB;
          DDRC |= SORTC;
          DDRD |= SORTD;   
 //------fin initialisation des sorties -----  
   
          
          
  //------ Configuration des entree -----
  
		  //variable de entrée port B
		  //...
          //variable de entrée port C
          ENTC &= ~( 1 << PORTC5 ); 
		  ENTC &= ~( 1 << PORTC4 );		
          //variable de entrée port D
		  //...
		
			DDRB &= ENTB;
			DDRC &= ENTC;
			DDRD &= ENTD;
			
  //------ fin Configuration des entree -----

  //------écriture des sorties en initialisation (si besoin)-----
        PORTC |= 0x30;
  //------------------fin écriture des sorties -----------
  
 
}




void loop()                     
{
 
  //-----------Lecture de toutes les entrées (Copie)-------
    
    
     
      // premier principe automate: lire les entrèes.
      CopyPIN[0] = PINB;
      CopyPIN[1] = PINC;
      CopyPIN[2] = PIND;
	
    //-----------fin Lecture de toutes les entrées (Copie)-------
      
      //--------- repérage des receptivités  -------
          r1=I1;
          r2=I2; 
           
      //--------- fin repérage des receptivités  -------
	  
	  
       //------------Structure graphcet --------------
       
       structure_G7();
      
      //------------ fin Structure graphcet --------------
      
       
      if ( e1 ==1)
	  {
		 
         // a faire ici ou en "ecriture des Sortie"
             // initialisation des variable de sortie 
              CmdSortD |= (1<< PORTD4) ;
             CmdSortD &= ~(1<< PORTD6) ;
             // fin initialisation des variable de sortie   
	  
	  }
      
	   if ( e2 ==1)
	  {
		
          // a faire ici ou en "ecriture des Sortie"
             // initialisation des variable de sortie 
               CmdSortD |= (1<< PORTD6) ;
              CmdSortD &= ~(1<< PORTD4) ; 
             // fin initialisation des variable de sortie     
	  }
          
           
           
           
           
           
      //----------------ecriture des Sortie -------------
        // /!\ fonctionnement monostable /!\ remet toutes lses sortie à zéro ne prend pas en compte les états initiaux des sorties .. erreur.TXT chap1
          
      PORTB = (PORTB & (~SORTB)) | (SORTB & CmdSortB);
      PORTC = (PORTC & (~SORTC)) | (SORTC & CmdSortC); 
      PORTD = (PORTD & (~SORTD)) | (SORTD & CmdSortD);
     
       //----------------fin ecriture des Sortie -------------
}

// fonction de la sctructur du G7
void structure_G7()
{
      // -- ajout 6/2/13 --	  
	  Copie_etape[] = etapes[];	 	  
	  // -- fin ajout 6/2/13 --
      
	  do {
		  if(  get_etape(0,0) e1 && r1)
		  {
			set_etape(0,0,0);
			e1=0;
			e2=1;        
		  }      
		  if( e2 && r2 )
		  {
			
			e2=0;
			e1=1;  
		  }
		  Etat_fin[NB_etapes] =etapes[];
	  }while(Copie_etape[]==Etat_fin[])
	  
	  
    return;
}
 // -- ajout 6/2/13 -- ou 
void set_etape(int num_case, char num_Bit, int valeur)
{
	if (valeur == 1)
	{
		tab_etape[num_case] |= 1<<num_Bit;
		return;
	}
	else if  (valeur == 0)
	{
			tab_etape[num_case] &=  ~(1<<num_Bit);
			return;
	}
	
	
}
 // -- fin ajout 6/2/13 -- 
 
 char get_etape(int num_case, char num_Bit){
	return (tab_etape[num_case]>>num_Bit) & 0x0001;
}